{
 "cells": [
  {
   "cell_type": "raw",
   "metadata": {},
   "source": [
    "运⾏课上给出的notebook的代码： \n",
    "https://www.tinymind.com/ai100/notebooks/74 \n",
    "给出代码的运⾏log截图并提供⼼得体会⽂档描述对整个模型构建及训练过程的理解。  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "这个作业中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个 简单的识别示例。\n",
    "本作业中，需要参与者应用视频中学到的知识：dropout，learingratedecay，初始化等等，将网络最终在validation数据上的得分尽可能的提高。\n",
    "\n",
    "首先导入一些用到的库。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "先来看看数据长什么样子"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\")\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量， 所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4, idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "x = tf.placeholder(\"float\", [None, 784])\n",
    "y = tf.placeholder(\"int64\", [None])\n",
    "learning_rate = tf.placeholder(\"float\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "L1_units_count = 100\n",
    "\n",
    "W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x, W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "L2_units_count = 10 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits, 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。\n",
    "试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布， 要想看到概率分布，还需要做一下softmax。\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.553921, the validation accuracy is 0.8802\n",
      "after 200 training steps, the loss is 0.543969, the validation accuracy is 0.8978\n",
      "after 300 training steps, the loss is 0.189981, the validation accuracy is 0.9218\n",
      "after 400 training steps, the loss is 0.455403, the validation accuracy is 0.94\n",
      "after 500 training steps, the loss is 0.205807, the validation accuracy is 0.9466\n",
      "after 600 training steps, the loss is 0.146104, the validation accuracy is 0.9396\n",
      "after 700 training steps, the loss is 0.129211, the validation accuracy is 0.9512\n",
      "after 800 training steps, the loss is 0.0685897, the validation accuracy is 0.9536\n",
      "after 900 training steps, the loss is 0.184469, the validation accuracy is 0.9514\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9412\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面，用我们训练的模型做一个测试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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MF9FtesSb6720bGdrLRPOn3kxtd87V1uNeV5+zya7JXRn8619kD7Ar0Dh3qXEz3SZKKV5r8088XNrdx45H9PsvK1HZH6uwDySJeIiCgk7HSJiIhCUuGHlzOn/W4tH/LLuW788/5vB77vjVZf+pbs3y456p3OfpLvIfadhto30bYvpqCSSq/rDdvPOP3xiNQsRNNn4lXWctsPOKQctitq2ZefrP7EG6qctqFF3OU/2PpFN+5RKXhXN323tyUOnnKxldb2m/luzO11b3kLvX3a96fYl1TV/tS7u9djTX7wEu7+AUH8w8T5xbj/W7eJF7pxu+vXuXGdFakfTo7EI10iIqKQsNMlIiIKCTtdIiKikFT4Od38rVut5UZX13bjASNOduNbW31q5Ts0y5vhGbutnpV22//OduN213m3GuOcUOKk1/ba6drJ3hxRtkSfwwWAh9Z7l6u0v9Sey+fTg8Lhv4RjzTXfW2l31Z/lLfjjEvN2b3sitr5Z3h1ecd5o73aDrW+25wC5zcbOfztHAPiwj3cJ2JMXek8S2t7avoXj58d552H0//xaL6GQRzd1fHmXtdxq6myvHrFUNoV4pEtERBQSdrpEREQhqfDDy5H2LPGejIGjvHDoUPuWNlsP9J5e0WnYOiut3V+peXpFRbLuZO/uN/2qfuvGeYUMSf3vrj5uXG07LxFKhTq+OwJN/b6Dlfboh96Q4fW17eH/kuj03UVuXOlX+85kzR6Y5MatUfouKykP8lavceOmD64JzHc1vLtVdUBsT/QqZDMv9XikS0REFBJ2ukRERCHh8HKMGj45yV72xaX9bLny6IwbvnLjPA0+97jduMvduMNYDimXJpEPRP+qW3Uvxv5xl98GM4vORBQyHukSERGFhJ0uERFRSNjpEhERhYRzulQmda/iXdqVLt5vx5932fcQ6vKwd6kC596JKNV4pEtERBQSdrpEREQh4fAylUnXvuk9bHz+pc+68UUjrrbyNV9kX+pFRJRKPNIlIiIKCTtdIiKikLDTJSIiCgnndKlManmnN1fb/84ebtwcnMMlotKLR7pEREQhYadLREQUElEty48DJiIiKjt4pEtERBQSdrpEREQhYadLREQUEna6REREISnzna6IDBeRXBHZJiLVYnzPnyKyW0RGFZJHRWS7iNyXuNomnohkOeueKyL3pro+JSEiI532WBJj/g7OOueJyCUBefqISL6T77iEVjhEZbF9K/o2WRQR+UZEdonIxFTXpSQq+vYay/oUplR0uiLS2fkibhaRP0TktGIWMVpVs1V1u1NeLRF5TUTWOP+G+zOralsA98dQbndVvc1XzwEi8pvzB58kIl18aVki8piIrBSRjSLyrIhkBqxvBxH5SETWisgGEflcRDr60o8WkcUiskpEzva9XktEfhGR6r51yVHVbPx/e/cdZkV1/gH8+9KW3lYBqUuvUgSsoYpBjRKImthFg4TE9rPFLgjm0cQnsSB2sMWKugI+sUUhagQRpAmCUYqNJkpH2r6/P87ZM3Ou9969e8vswn4/z8PDO3vOPTNzz505M+dMAZ5JYX1yRkQaikih3SmuEZGzS1nE31S1IFRenohMEZGtIrJORK4qTlPVz+06v19Cmd/Z38UbtszDRGS6rSMVkYJw5mTztOnHi8hyEdkpIjNFpFWiGYtIgc2z035mSEw55bp+ReRSEZknIrtF5Ik0iojdJgfZ72NLvJ11BtvkIyKywu6wR8ZZjyttXW6xdZsXSktYR3HKSfjbEJEWIjLHbst/j/ncGyLSJ2ZdBwMYk8K65oyIzLIN/3b7b0Upi4jdXosb4u2hf5WBjLZXEZGbROQr+70/LyJ1Q/NsKCIviMj39t8z4fQ461zT7pe/t7+H90JpZ9vtcZWIDAz9va2YfX3l4r+VYn3iKvNGV0SqAJgG4DUADQGMBvBPEemQQbF3A6gJoADAkQDOE5ELM1zO9jA7vjEA6gOYAWC6XX4AuB5AHwDdAHQAcASAmxMUVx/AdAAdATQGMBfmOyh2D4BTAZwI4MFQhd8B4E5V3ZbJuuTIJAB7YNbnHJjl7ppBeeMAtAfQCsAgAH+WzI+AiwC8AeC00s5TRA4B8AqAW2B+p/MAvJBkXs8BWAAgH8BNAF4SkUNt2oFQv98BuB3AlCyVt8OWdW2Wyiu2CMCfAHwSmyAiQ2G2y+Nh9gVtANwWypKsjmKNQ+Lf4w0AngTQGsDw4kbWHlCtVNV56a9eTl1qG7naqtqx5Owl+luovNqquj/D8s4HcB6A4wA0BVADwMRQ+u0AGsDUa1uYfc+4JOU9ArPtdrb/Xwm4NuhOmH32ZQDuD33mPgBXZWFdnDJvdAF0gvlC71bV/ar6LoD/wnzZ6ToV5gewU1VXA5gM4KIMl3MogPdV9QNV3QfgrwCaARgQmud9qvqDqm6Eqay481TVuao62ebdC3OQ0FFE8m2WWqr6qaougmnI8kXkSACtVfXFDNcj68R0IZ4G4BZV3a6qH8AcVGRSh+cDmKCqP6rqZwAeBTAyk+VU1fWq+gCAj9OY528ALFXVqar6E8zG3UNEOsUWYg8YjwAwVlV3qerLAJYgaOzLff2q6iuq+iqATVkqb66qPg1gZTbKC5U7SVXfAfBTnOQLAExW1aWq+iOACbD1mUIdxUr222gN4F1V3QLz22pjz7iuB3BjFlazojoVpv6+VtXtMPvc34lITZveGsCrqrrVfveFAOIe6IvpSRwGYLSqbrRtzXybnA/gW1VdC+DfMI04ROR0+/c52Vyp8tDoSoK/dXMTIptF5BcZlOuVlyaJU2a43HjpzUWkXgpl9wewTlWLd3AbRKSHiPSAOTv7Eebs6PIMlj+XOgDYr6qfh/62CHYDEJGWtg5bplKYiDSAORBbFK+8XEhhnl3Dabbb9MsEy9QV5gwnfMYaLutAq9+fSXObjJpXZzZubA9uS6ojJ4XfxqcAThCR+jC9XctgGvh7VHVzltYlF+6wXa3/jelSLdX2GvIn28U+X0QSHbyURrx9ah5MjwNgetdOEZEGto5OA/B6grKOArAGwG12nZeElnEjzIFvcwAnAFgqIrVheipvyMJ6eMpDo7scwAYA14pIVRH5JczZY/HRDFS1vj17StUbAK4XkToi0g7mjLNmCZ8pydsABogZ8K8GcwRbLVTu6wCuEJFDRaQJgh1o0vnaip4EIDx+OAbAvTDdIecB+COAdwBUFzP+O1NEBvyssLJTG8CWmL9tAVAHAFT1K1uHX5WivOIyflZejpQ0z6TrGKesZHkPtPr9mTS2ybIQWw/FcZ04acXpieoz/PnYvHcA6AfgPzDbclUA3QHMEJFnReQ9Ebk03ZXIketgzuiawfwOZ4hIWyCt7RUwPXvtATSCGYJ5QkSOy3AZXwcwSszYez27zECwT/0EZh+8yf7bD+CBBGU1hzlB2gJzAHUpgCdFpLOqFsFsgy8BuAbAxQDGw3RlH263xzdFJNMTNwDloNG13avDAfwKwDoAVwN4EcA3GRR7OYBdAP4HM1b6XLLyROT10OD/OQmWczlMd9X9ANYCOATmiLa43L/AjA8tBPAhgFcB7IU5oEg030MBvAXgAVV9LjSvhao6UFWPsvO4COYik8dgxqQuBPC0iMTrJSgL2wHEXsBQF0C6Y5PbQ2WkVF7MBRylPUJPZZ6lWcekeQ/A+o1cKttkCmLroTjeFietOD1RfYY/7+W1w0S/U9UeMAdTE2HGBq+HOQseAmCMhC68LGuq+pGqbrMX6j0JM6R3cgblfaKqm1R1n6r+C+b6l98kyp/i9joFZt89C8BSADPt34v3uVMBfA5z8FMXpucp0dXvu2D2x7er6h5V/Y8t75d2+d9R1aNVdQBM71MfAE8AeBpmGGECzPaZsTJvdAFAVRer6gBVzVfVoTBHYHMzKO8HVT1HVZuoaleY9UxYnqqeFBr8T3iVqKq+pKrdVDUfwFiYiyo+tmm7VPVSVW2mqm1gjrzmJxqAt90hbwGYrqrJboG4G8DNqroLwOEA5tlx6qoAEl30EbXPAVSxF5sV6wGzoZSaHX9ba8tIqbyYCzhKc4Se6jyXhtPsOHbbBMu0FGZcL3zWlGj5D4T6jVyq22QJvDqz8Xo7jJNyHZXy9zgawBxV/RRBfe6BGS/OyplSjijiD/XlpLxUtldVLVLVsapaoKrNYb7vb+0/wNTBw6q6w475PoTEBw6LU1loe6B7P8yJ2yEAKqvqGpj9fPdUyihJuWh0RaS7iFQXc0n3NQAOgznKSLe8tiKSLyKVReQkmA0h43scRaS3LfNQAA8DmGHPgCEizUSkqRhHw3SxjE1QTl0AbwL4r6pen2R+JwCorqqv2T+tAjBYzFXBecjSRS6ZsuObrwAYLyK1bLfSr2GOEtP1FICb7XhNJ5gunycyXVYRqQ7z3QFAnp1OZZ6FALqJyGn2M7cCWFxc/2F2bHshgLH2dz0CZoN9OWZZym39ikgVu56VAVS265H2+7dFpJItr6qZlOp2mCbT5axmyxUAVW25xfu1pwD8XkS62IPcm2HrM9U6Cinx9ygijQBcguAK2lUABtnxwT7I8kVk6RJza9rQ4jq1PQn9YfZJ6ZZ5uojUtvX8SwDnwlxMmclyNrT7crG9BP8AMN52BwOmIRwlIjVEpAbMfn5RguLeA/AVgBvsOh8HYCB+vs6jACxQ1YUw218NO+9ByFb9qWqZ/wNwF8zFJNth+vHbxaRvB9AvwWfHAfhnzN9+C3PLw06YDWtoKp+LSdc4y/EBTJfSDzCNbq1QWn8Aq+08VwA4J+azrwO40cYX2PJ32HUr/tcylD/PLnur0N+Ot/NYC+DMmPKfgOk6Kas6bAjTpb4D5sd9diitZez6lbTsdv2nANgKYD3MZfuxn5sFYFSCMgcC+CZBvXr/Up0nTDfhcpiuqlkACkJpDwF4KDRdYPPssr+HIXHWr9zWr90+Yr+rcaH00m6TA+OUN6ukz8Wpu9htclaccgeG0q+ydbkVwOMA8lKpI5jb3paW8vf4FIAzQtMtAHwEs2/7e0zekQA+iKo+Y+Z9KEyDtQ3AZgBzAJwQSk9ne30fZrx0K0zDd2acz81CKbZXmAs0V8DsU9fEfucwVy/PgGkcf4C5lqd9KH0pQvthmAvfZsPso5YBGBFT3iEwwwF1Y34H62C2y0Gprk/S778sKj3LP6Cb7Ze4GaFGsITPrLA/qilJ8vxkf0QTynodS1iXPLvuO2BufyjzZUpjHR619fFlivnb23XeCWBkgjz97c50M+IcdB0o/w7E+q3o22QK6/q2bfDeKetlSXP5K/T2msr6JPvH9+kSERFFpFyM6RIREVUEbHSJiIgikvbViOk4odIZ7MsuI28XTc36PZ+sz7KTi/oEWKdlidvowSVRffJMl4iIKCJsdImIiCLCRpeIiCgibHSJiIgiwkaXiIgoImx0iYiIIsJGl4iIKCJsdImIiCLCRpeIiCgibHSJiIgiwkaXiIgoImx0iYiIIsJGl4iIKCKRvmWIiCibvrj7aBd/+buHvLTz1/R38fpjtka2TFQ6+wb3dvGqEUGTdPXx//Lyja632sWV4L/ApwjBy5TGbujl4hmru3n5mt5ROZiYuySt5c0Uz3SJiIgiwkaXiIgoIuxepoNalSaNXbzluAIXf3uC/27vVcMecfFe3e+lHbfwTBdv/LqBi7vcuc7Lt2/1VxktK5XecUcvS5j2VKv3XNxvxB+8tJqFH+VsmSqqb6871pve0X6Pi8/qPTfh525rFGx7RShycaWYc8JwWudZo720RtPzXFznhTkuborEv4+ywjNdIiKiiLDRJSIiigi7l+mAJ3lB19LK247w0u4//TEXD6ixM2EZezU4/gx3YwHA+z2fDSZ6hsL8i7x8Lc9IaXEpi8JdyMl819+/2rVdYS6WpmJbdPn93nT4iuL1+3e5+IFNfjd0h9eDrv9a/6vm4urf+0NA+ZNnu7gtFmS2sGWIZ7pEREQRYaNLREQUETa6REREEeGYboz9A4MxwSq3rnfxjI7TvXxVJXiySbJbTPJvqupiWf2tl2/TqV1c3PDVT720om3bSrPYFdpX1wZPtFly3r1plXHhmuNdPLnV2yl9ZuGxU7zpYeib1rwp99pdOafkTJSR/ktO96bfPfwFF4fHcef38s/1OmBebhesnOGZLhERUUTY6BIREUWkQnYvh28x2Tasp5c29o6gyzB8i4l/EwmwN3Q1e7JbTI64ZaSLezTxj3GmFQSX2Petf5mX1njih/EXngAAekwPF0+5aGKpP9/98cu96dYTPnFxp7sv8dKW/3pSqcsnqmjqX7zHm37tnXwXD68/38ULO5/t5dv/2f9yu2DlDM90iYiIIsJGl4iIKCJsdImIiCJSIcd0dw883MXv3nN/wnwzd9V28a23+4/8q7pTY7M7W1sFxzLVQk8e/PM1/i0mW4r2ubj2Wv+2I/KFx3ABQG//wcW9gyH6n429F25v5OIpI4e5uOAj/60nWhR8/x2vXOSlnfTqH1084aHgjSh98vw6G/JpcJvXv7vViV0FyoG2L4xxcexL7MPCL7sHeAtRLuz7+htv+vrCc1y87NxgP7unib9tVP4st8tV3vBMl4iIKCJsdImIiCJSYbqXw92Tdzz4cMJ8Z315sou3jm3h4gYzZ8fLHle9dq1d3HPqly7uXM0/xuk07UoXd3iJL9VOZkPfWt70x52Crvrw08G2FPm3LYx9MXg6WMHs1OpQd+/2pqu+FTwx59w3g+7Mpaf6QxPXNgzq+tHnLvDSWp/ld1lTdiTrUqYyFnqxU6XQxKau1b1sDaU3UpE3L7i1aP/WrZktWxnimS4REVFE2OgSERFFpMJ0L/94U/AS5fDVricv/42Xr/I1dYN4wSdIx+bejV08ttGLCfO1eCut4iukSkM2edPhp4CFnw524cphXr6CW1IfFkhFhz8GVz1P/EVXL+2qhstdfE6Xj720D1ENRAezKi2ae9N3Dn/GxeEX2s+5wX8pSaXQuV94u64Uc044cMkZLt491d/2wi+4L+94pktERBQRNrpEREQRYaNLREQUkYN2THfV89296aW9HnfxN/uC8d1KNzXw8umCxaWeV/itRQDQ7v+WBeWHjmvCL0oHgBqv+k9FIl+VZk1dfHXHf6f0mZVT23vTjbExq8sUNmXaEG/6qguXJ8hJdHAKj+Oe/KZ/W9ywWj+6eOyGXi6esbqbl0/n1I9b9rAzP/Cmr2oT7AOGj9/spRWND8aMTzxvtIvDtxkB5eNWI57pEhERRYSNLhERUUQO2u7l87v4XbfhS9HX7AtuC8Kc0ncnA36X8op7/IfxT2sZvPQ8/AD+NXd19PLVBJ9ClcyPv2jp4tNrT0uYb/TXA13cLPQEMADYh7LRrYb/8Pe5bQa7eN/K1REvDVFubO8ZDAGNrudvo/0X/9bFdU8KtsumWIZUzP+rf064qHk/F988qpWXdvSJS1z8xtPBS0kmbW7r5Xv9wqAMzF2CssAzXSIiooiw0SUiIorIQdu9nG2Vu/pdw59dVs/Fy0+dFJvdCb+Tt86Hq7w0vkE3uY1HSMmZAHx5Z2cX11hXPq4IP6WW/wStf/Rp4uLa7F6OHN+fmxvVZwTb2ykz/BcX1MWXsdkzsu+bb13ccty3Xtp344K413WXuTj2CugJLwQvSrnh92O8tCrvzs/CUpaMZ7pEREQRYaNLREQUETa6REREETlox3RfXtXTm742P7g8vFfeDhf3W/xTSuUdWfMVb3pQjeBzRbGZQ65edLqLm69fmtK8yNhfM/EbR8LKy5O9qkplF4fffERE0Wn21w9dzwuTmQAABhZJREFUvOiZFl7aYW9ucfH4xx710q74yyUuzuVbi3imS0REFBE2ukRERBE5aLuXm5zrX1I+7NURLn6tU/DklHC3c2n0C12WXnSWf3vI+z2fdXGjR2umVT4B3buvdnFR0k788mGvBjeBHQjLS3SwC99mBABTbxzq4rXj/NvIHrj5Phdf0OIKF7cc9yGyiWe6REREEWGjS0REFBE2ukRERBE5aMd0i7Zt8/9wfDA9eMSfXLyhd+LjjgafBfd91HvG7//f+PRuFy/v+byXNnlLgYtrLl3r4rJ64w1Fb82+Pd50jY17EuQkoqjUmBbcXrhofuLbiRZefK+Lh43rm9Vl4JkuERFRRNjoEhERReSg7V5OpmZh8PL4gsL0ylg++DEXx94eMmnFABc3/Tq1FzbTgWfU8LcSpv368Wu96ZYzs3vbARnnr+nv4qdavZcw3xd3H+1N861DFHs70X2LBrl4zICVOZsvz3SJiIgiwkaXiIgoIhWyezkdsS+xB4IXHsdeqdr4vuoRLNHBb8etTV087/HKXlqfvODpT19NPdzFLc9I7wlj6ehbY5U3PXe3uLjgrkVeGp9PRVTOHHm4N/n00ZNdPGlz25zNlme6REREEWGjS0REFBE2ukRERBHhmG6KVo6tljDtjAWjvOkmMz/J9eJUCJX+s8DFl9xzqZf28XUTXfz2UQ+6eOSgy718lbNcF6ue7+7i46rP99KOXXCWixvu+Dyr86XAzhFHufipVg+X4ZJQ2JrbjvWmq38fxI0nlo9b5ip36eDireN3eGnNq+xy8Rsj+4VSsnudCM90iYiIIsJGl4iIKCLsXk5Cj+nh4ulHPRCTGtwWJO80iGiJKq7DZv3gTfcZfK6L5/X9p4u/GejfrtVqZubz3nFa0J354lHBi65n787z8jW8nbeKRaH1nz8r60Uga9Pvj3HxklETvbTOs4Jht8Z+UsaqtGjuTa85u2XcfG1O9p8sdWOL51w8Z5d/W9CIccFT5Bp+PDvTRUyIZ7pEREQRYaNLREQUETa6REREEeGYbhIb+tZycesq/nhd+M1CVX5SUG4VLV7uTTe7KXgsZ2FhQxdPH3mXl+/EQ65ycftLPkIi0ruri9cfU89Le/jq4IXWnasFx6mdZoz28nWYMxeUfeFbhIDUbxPqd8kfXNyukG8VyrWq4j+q9bOBwZvYFqwK9pdnz77YyyehuH+bL1y8YnMjL9/Mw6e6uBL8WwGLoKG0oMQHNrf28p31bvCb6DJurZfW8JvcjeOG8UyXiIgoImx0iYiIIsLu5SR+OiTosoh9Uf09P3Rxcf6j0XRLUGD/0hUufvLE4OXTDz/i19Mbp/zDxS/26+3i558d7OV7bHRwT0OvvMTvBDpx2eku7vTgNi+NbxKKXtsXxrg49sX0NZF4OIGyI39ysO87dscYL23DqbvjfubJYyZ700fmBfvZ8Nt9iryOZ/8WpKJN/hMC2xTujTuvavO/8KY7bJ3n4n1xP5F7PNMlIiKKCBtdIiKiiLB7OYlzhyd+nNGUaUNcXAB2L5elfStXuzjvrEO9tDG9rnBx1evWuXj+Zfd6+TrNuCRh+a1fCTqO82YudnHR3j2lXlYqvZqFfjfx0MKeLm4HXpVcXtR5fk7MdPx843FEiiX6wzdtsSBBvsT2l/oTucczXSIiooiw0SUiIooIG10iIqKIcEw3iZdXBWNH1+Zn90XGlBv7N270pqu+FZp+KwiHoa+XrwNSe5oUnz1GRJngmS4REVFE2OgSERFFhN3LSeg7wYP0b2zuP3S98bzyeDE6ERGVZzzTJSIiiggbXSIiooiw0SUiIooIx3STaHzfhy7+9D4/rUaKt5gQEREV45kuERFRRNjoEhERRURU+YwdIiKiKPBMl4iIKCJsdImIiCLCRpeIiCgibHSJiIgiwkaXiIgoImx0iYiIIsJGl4iIKCJsdImIiCLCRpeIiCgibHSJiIgiwkaXiIgoImx0iYiIIsJGl4iIKCJsdImIiCLCRpeIiCgibHSJiIgiwkaXiIgoImx0iYiIIsJGl4iIKCJsdImIiCLCRpeIiCgibHSJiIgiwkaXiIgoIv8PjGaMB9H6CkMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以作业提供的参数运行出来的结果，只看上面几个数字还是很不错的，但是总体准确率不太理想。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 总结\n",
    "\n",
    "1）对模型结构的理解：本demo对一个没有隐层的全连接神经网络（由一个输入特征维度784，L1_units_count=100个神经元的输入层和一个L2_units_count=10个神经元的输出层组成），使用随机梯度下降法（每轮迭代随机抽样batch_size=32个样本共trainig_step = 1000轮）进行训练，并使用了正态分布对参数进行了初始化，此外还使用relu作为激活函数，右侧可避免梯度消失问题，但是左侧存在神经元死亡的隐患。\n",
    "2）对模型训练过程（梯度如何计算，参数如何更新）的理解：使用反向传播算法求各层神经元对输入连接权重W（或bias）的偏导，得到各样本（或各微批样本）的梯度∇w，梯度与学习率η相乘作为参数的更新步长，即：θ=θ−η⋅∇(θ) × J(θ;x(i);y(i))，其中x(i)和y(i)为训练样本。\n",
    "3）对计算图的理解：计算图是先定义好各计算逻辑的执行步骤（但是还没有执行），各步骤连成一条有向无环图（DAG），然后需要执行图中定义的逻辑时，才开启会话真正执行DAG中的代码。\n",
    "4）解释这⾥的模型为什么效果⽐较差：此demo模型比较简单，只有输入层和输出层，参数不足，从训练集和测试集总体准确率均不太理想可知此模型应该是欠拟合了，可通过增加神经元或神经网络深度来看看拟合效果是否改善，如果过拟合了还要对参数进行惩罚。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
